设计模式-行为型模式讲解一(责任链、命令、迭代器)

一、行为型设计模式

上篇,我们呢讲解了结构型设计模式,包括 适配器模式、桥接模式、组合模式、装饰者模式、享元模式、代理模式、外观模式。

文章地址(适配器、桥接、组合、享元):https://blog.csdn.net/qq_43692950/article/details/120248267
文章地址( 装饰者、外观、代理):https://blog.csdn.net/qq_43692950/article/details/120249265

这篇文章我们来讲解下行为型设计模式:主要用于描述类或对象之间的交互或职责的分配,为设计类的交互和职责分配做指南。

在本文主要介绍:责任链、命令、迭代器模式。

二、责任链模式

责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。

在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

优点是降低了耦合度,它将请求的发送者和接收者解耦。简化了对象,使得对象不需要知道链的结构。 增强给对象指派职责的灵活性,通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。 增加新的请求处理类很方便。

举个例子:在平时开发中,我们经常需要打印日志来查看一些信息,但打日志时我们都会指定一个日志级别,比如 INFO、WARN、ERROR等,指定不同的级别打印的日志存储的文件是不同的,这种场景就可以使用责任链设计模式来设计解决。

下面使用程序演示下上面的例子:

  1. 定义日志接口
public interface LoggerInterFace {
    //指定下一个目标
    void setNextLogger(LoggerInterFace nextLogger);
    //打印日志
    void logMessage(int level, String message);
    //日志格式
    void writeFormat(String message);
}
  1. 定义日志抽象模板
public abstract class AbstractLogger implements LoggerInterFace {
    public static int INFO = 1;
    public static int WARN = 2;
    public static int ERROR = 3;

    private int level;
    private LoggerInterFace nextLogger;

    public AbstractLogger(int level) {
        this.level = level;
    }

    @Override
    public void setNextLogger(LoggerInterFace nextLogger) {
        this.nextLogger = nextLogger;
    }

    @Override
    public void logMessage(int level, String message) {
        if (this.level == level) {
            writeFormat(message);
        }
        if (nextLogger != null) {
            nextLogger.logMessage(level, message);
        }
    }

}
  1. 定义Info级别的实现
public class InfoLogger extends AbstractLogger {

   public InfoLogger(int level) {
      super(level);
   }

   @Override
   public void writeFormat(String message) {
      System.out.println(StringFormatter.concat(" 普通信息:", message).getValue());
   }

}
  1. 定义Warn级别的实现
public class WarnLogger extends AbstractLogger {

   public WarnLogger(int level) {
      super(level);
   }

   @Override
   public void writeFormat(String message) {
      System.out.println(StringFormatter.concat(" 警告信息:", message).getValue());
   }
}
  1. 定义Error级别的实现
public class ErrorLogger extends AbstractLogger {

    public ErrorLogger(int level) {
        super(level);
    }

    @Override
    public void writeFormat(String message) {
        System.out.println(StringFormatter.concat(" 错误信息:", message).getValue());
    }
}
  1. 定义日志工厂,定义责任链的顺序
public class LoggerFactory {

    public static LoggerInterFace getLogger() {
        //定义责任链的顺序
        List<AbstractLogger> list = new LinkedList<>();
        list.add(new ErrorLogger(AbstractLogger.ERROR));
        list.add(new WarnLogger(AbstractLogger.WARN));
        list.add(new InfoLogger(AbstractLogger.INFO));

        for (int i = 0; i < list.size() - 1; i++) {
            list.get(i).setNextLogger(list.get(i + 1));
        }

        return list.get(0);
    }
}
  1. 演示
public class demo {
    public static void main(String[] args) {
        LoggerInterFace logger = LoggerFactory.getLogger();

        logger.logMessage(AbstractLogger.INFO, " 打印普通日志");

        logger.logMessage(AbstractLogger.WARN, " 打印警告日志");

        logger.logMessage(AbstractLogger.ERROR, " 打印错误日志");
    }
}

在这里插入图片描述

三、命令模式

命令模式(Command Pattern)是一种数据驱动的设计模式,请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。

优点是降低了系统耦合度,新的命令可以很容易添加到系统中去。

还是用原先画各种形状的例子来说,我们可以采用命令设计模式来设计,绘画不同的形状就将对应形状的实现传递给命令执行器,以一种统一的命令的形式来做不同的操作。可以有效降低耦合性和提高扩展性。

下面使用程序演示下:

  1. 定义形状接口
public interface ShapeInterFace {
    void draw();
}
  1. 定义绘制圆形的实现
public class CircleShape implements ShapeInterFace {
    @Override
    public void draw() {
        System.out.println("画圆形");
    }
}
  1. 定义绘制矩形的实现
public class RectangleShape implements ShapeInterFace {
    @Override
    public void draw() {
        System.out.println("画矩形!");
    }
}

  1. 定义命令接口
public interface CommandInterFace {
    void execute();
}
  1. 定义命令抽象模板
public abstract class CommandAbstract implements CommandInterFace {
    protected ShapeInterFace shape;

    public CommandAbstract(ShapeInterFace shape) {
        this.shape = shape;
    }
}
  1. 定义形状命令的实现
public class ShapeCommand extends CommandAbstract {

    public ShapeCommand(ShapeInterFace shape) {
        super(shape);
    }

    @Override
    public void execute() {
        shape.draw();
    }
}
  1. 定义命令执行器
public class Invoker {
    private CommandInterFace command;

    public void setCommand(CommandInterFace command) {
        this.command = command;
    }

    public void executeCommand() {
        command.execute();
    }
}
  1. 演示
public class demo {
    public static void main(String[] args) {
        Invoker invoker = new Invoker();
        invoker.setCommand(new ShapeCommand(new CircleShape()));
        invoker.executeCommand();

        invoker.setCommand(new ShapeCommand(new RectangleShape()));
        invoker.executeCommand();
    }
}

四、迭代器模式

迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。优点它支持以不同的方式遍历一个聚合对象。迭代器简化了聚合类。 在同一个聚合上可以有多个遍历。 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。

下面我们使用程序看下迭代器的设计过程:

  1. 定义迭代器接口
public interface Iterator {
   public boolean hasNext();
   public Object next();
}
  1. 定义迭代器的实现
public class NameIterator implements Iterator {
    private int index;
    private String[] names;

    public NameIterator(String[] names) {
        this.names = names;
    }

    @Override
    public boolean hasNext() {
        if (index < names.length) {
            return true;
        }
        return false;
    }

    @Override
    public Object next() {
        if (this.hasNext()) {
            return names[index++];
        }
        return null;
    }
}
  1. 演示
public class demo {
   public static void main(String[] args) {
      String[] names = {"A" , "B" ,"C" , "D"};

      NameIterator iterator = new NameIterator(names);
      while (iterator.hasNext()){
         String name = (String)iterator.next();
         System.out.println(name);
      }
   }
}

在这里插入图片描述

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
目 录 序言 前言 读者指南 第1章 引言 1 1.1 什么是设计模式 2 1.2 Smalltalk MVC设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象接口 9 1.6.4 描述对象的实现 10 1.6.5 运用复用机制 13 1.6.6 关联运行时刻和编译时刻的 结构 15 1.6.7 设计应支持变化 16 1.7 怎样选择设计模式 19 1.8 怎样使用设计模式 20 第2章 实例研究:设计一个文档编 辑器 22 2.1 设计问题 23 2.2 文档结构 23 2.2.1 递归组合 24 2.2.2 图元 25 2.2.3 组合模式 27 2.3 格式化 27 2.3.1 封装格式化算法 27 2.3.2 Compositor和Composition 27 2.3.3 策略模式 29 2.4 修饰用户界面 29 2.4.1 透明围栏 29 2.4.2 Monoglyph 30 2.4.3 Decorator 模式 32 2.5 支持多种视感标准 32 2.5.1 对象创建的抽象 32 2.5.2 工厂类和产品类 33 2.5.3 Abstract Factory模式 35 2.6 支持多种窗口系统 35 2.6.1 我们是否可以使用Abstract Factory 模式 35 2.6.2 封装实现依赖关系 35 2.6.3 Window和WindowImp 37 2.6.4 Bridge 模式 40 2.7 用户操作 40 2.7.1 封装一个请求 41 2.7.2 Command 类及其子类 41 2.7.3 撤消和重做 42 2.7.4 命令历史记录 42 2.7.5 Command 模式 44 2.8 拼写检查和断字处理 44 2.8.1 访问分散的信息 44 2.8.2 封装访问和遍历 45 2.8.3 Iterator类及其子类 46 2.8.4 Iterator模式 48 2.8.5 遍历和遍历过程的动作 48 2.8.6 封装分析 48 2.8.7 Visitor 类及其子类 51 2.8.8 Visitor 模式 52 2.9 小结 53 第3章 创建模式 54 3.1 Abstract Factory(抽象工厂)— 对象创建模式 57 3.2 Builder(生成器)—对象创建 模式 63 3.3 Factory Method(工厂方法)— 对象创建模式 70 3.4 Prototype(原)—对象创建 模式 87 3.5 Singleton(单件)—对象创建 模式 84 3.6 创建模式的讨论 89 第4章 结构模式 91 4.1 Adapter(适配器)—类对象结构 模式 92 4.2 Bridge(桥接)—对象结构 模式 100 4.3 Composite(组成)—对象结构 模式 107 4.4 Decorator(装饰)—对象结构 模式 115 4.5 FACADE(外观)—对象结构 模式 121 4.6 Flyweight(享元)—对象结构 模式 128 4.7 Proxy(代理)—对象结构 模式 137 4.8 结构模式的讨论 144 4.8.1 Adapter与Bridge 144 4.8.2 Composite、Decorator与Proxy 145 第5章 行为模式 147 5.1 CHAIN OF RESPONSIBIL ITY(职责) —对象行为模式 147 5.2 COMMAND(命令)—对象行为 模式 154 5.3 INTERPRETER(解释器)—类行为 模式 162 5.4 ITERATOR(迭代器)—对象行为 模式 171 5.5 MEDIATOR(介者)—对象行为 模式 181 5.6 MEMENTO(备忘录)—对象行为 模式 188 5.7 OBSERVER(观察者)—对象行为 模式 194 5.8 STATE(状态)—对象行为模式 201 5.9 STRATEGY(策略)—对象行为 模式 208 5.10 TEMPLATE METHOD(模板方法) —类行为模式 214 5.11 VISITOR(访问者)—对象行为 模式 218 5.12 行为模式的讨论 228 5.12 1 封装变化 228 5.12.2
共150讲,时长共 33小时18分钟 1) 优秀的程序应该是这样的:阅读时,感觉很优雅;新增功能时,感觉很轻松;运行时,感觉很快速,这就需要设计模式支撑。 2) 设计模式包含了大量的编程思想,讲授和真正掌握并不容易,网上的设计模式课程不少,大多讲解的比较晦涩,没有真实的应用场景和框架源码支撑,学习后,只知其形,不知其神。就会造成这样结果: 知道各种设计模式,但是不知道怎么使用到真实项目。本课程针对上述问题,有针对性的进行了升级 (1) 授课方式采用 图解+框架源码分析的方式,让课程生动有趣好理解 (2) 系统全面的讲解设计模式,包括 设计模式七大原则、UML类图-类的六大关系、23种设计模式及其分类,比如 单例模式的8种实现方式、工厂模式的3种实现方式、适配器模式的3种实现、代理模式的3种方式、深拷贝等 3) 如果你想写出规范、漂亮的程序,就花时间来学习下设计模式吧 课程内容和目标 本课程是使用Java来讲解设计模式,考虑到设计模式比较抽象,授课采用 图解+框架源码分析的方式 1) 内容包括: 设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和实现、类的关联、聚合和组合) 23种设计模式包括:创建模式:单例模式(8种实现)、抽象工厂模式、原模式、建造者模式、工厂模式。结构模式:适配器模式(3种实现)、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式(3种实现)。行为模式:模版方法模式命令模式、访问者模式迭代器模式、观察者模式介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责模式(责任模式) 2) 学习目标:通过学习,学员能掌握主流设计模式,规范编程风格,提高优化程序结构和效率的能力

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小毕超

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值